Hopp til innhold

Algoritme for å bestemme ukedag

Fra Wikipedia, den frie encyklopedi

For å regne ut på hvilken ukedag en bestemt dato falt i fortid eller vil falle i fremtiden, kan man bruke ulike algoritmer. Alternativt kan man benytte evighetskalendere, som ikke krever noen beregninger fra brukerens side. Typisk kan man ønske å fastslå på hvilken ukedag noen ble født eller på hvilken ukedag en spesifikk historisk begivenhet fant sted.

Innføring

[rediger | rediger kilde]

For å bestemme ukedagen til en dato fra numeriske beregninger, starter man ved å tildele hver av de syv ukedagene (søndag, mandag, … lørdag) et tall, i rekkefølge. Vanligvis brukes 0 til 6, som tilsvarer ISO 8601s alternative bruk av 1 = mandag til 7 = søndag. Dette oppnås ved aritmetikk modulo 7. Modulo 7 er en operasjon som beregner resten av et tall når det deles med 7, for eksempel er 10 modulo 7 lik 3. Da behandles tallet 7 som null, tallet 8 som 1, tallet 9 som 2, osv. Dette tolkes slik at om søndag representeres som 0, så er 7 dager senere også en søndag, 8 dager senere er en mandag, osv.

Utgangspunktet for så godt som alle disse metodene er å starte med en gitt historisk dato hvor ukedagen er kjent, for eksempel ta utgangspunkt i at 1. januar 1800 var en onsdag. Deretter regner man ut hvor mange dager det er mellom den datoen og datoen man ønsker å finne ukedagen til. Til slutt bruker man modulær aritmetikk 7 for å fastslå på hvilken ukedag den aktuelle datoen falt eller vil falle.

En standardmetode er å slå opp numerisk verdi for første ukedag i et gitt århundre, slå opp (eller beregne, ved en kongruensmetode) en månedkorreksjon, beregne antall skuddår siden starten av århundret, endelig legge disse sammen med antall år siden århundrets begynnelse. Til slutt finner man antall forløpte dager og bruker modulo 7 for å bestemme ukedagen.[1]

Man kan enten summere først og finne resten (ved deling med 7) til slutt eller finne resten ved hvert trinn, som i Lewis Carrolls metode. Begge metodene er praktiske, den første metoden er enklere for elektroniske kalkulatorer og dataprogrammer, mens den siste kan være bedre egnet for hoderegning. Ingen av metodene gitt her sjekker inngangsdata, så hvis en starter med ufornuftige datoer vil det gi feil svar.

Nyttige begrep

[rediger | rediger kilde]

Samsvarende måneder

[rediger | rediger kilde]

«Samsvarende måneder» er de månedene innenfor samme kalenderår som starter på samme ukedag. For eksempel er det samsvar mellom september og desember, fordi 1. september faller på samme ukedag som 1. desember. Måneder kan bare samsvare hvis antallet dager mellom deres førstedager er delelig med 7, med andre ord, om det er et helt antall uker mellom deres førstedager. For eksempel februar samsvarer med mars (unntatt skuddår) fordi februar har 28 dager, som er nøyaktig fire uker. I et skuddår vil januar og februar ha andre samsvarsmåneder enn i et vanlig år, siden 29. februar betyr at alle senere måneder starter en dag senere.

Månedene samsvarer slik:
For vanlige år:

  • januar og oktober.
  • februar, mars og november.
  • april og juli.
  • Ingen måneder samsvarer med august.

For skuddår:

  • januar, april og juli.
  • februar og august.
  • mars og november.
  • Ingen måneder samsvarer med oktober.

For alle årene:

  • september og desember.
  • Ingen måneder samsvarer med mai eller juni.

I månedtabellen under, så har samsvarende måneder det samme tallet, et faktum som følger direkte fra definisjonen.

Samsvarende år

[rediger | rediger kilde]

Det er syv mulige forskjellige ukedager et år kan starte, og skuddår vil endre ukedagen for alle dager etter 29. februar. Dette betyr at et år kan ha 14 forskjellige konfigurasjoner (med andre ord, det er 14 forskjellige mulige årskalendere). For eksempel, 2011 er et normalår som begynner på en lørdag, som betyr at 2011 samsvarer med kalenderåret 2005. Men 2012 er et skuddår som starter på en søndag, som betyr at de første to månedene det året starter på samme dag som de gjør i 2006 (1. januar er en søndag, mens 1. februar er en onsdag), men på grunn av skuddår, så samsvarer de ti siste månedene det året med de ti siste månedene av 2007.

En tabellmetode for å beregne ukedag

[rediger | rediger kilde]

Grunnleggende metode for hoderegning

[rediger | rediger kilde]

Denne metoden er gyldig både for den den gregorianske kalenderen og for den julianske kalenderen. Storbritannia med sine kolonier begynte å bruke den gregorianske kalenderen på torsdag 14. september 1752, dagen før denne var onsdag, 2. september 1752 (Old Style). De områdene som nå utgjør USA begynte å bruke den nye kalenderen på forskjellige tidspunkt, avhengig av hvilken kolonimakt de lå under: Spania og Frankrike hadde brukt den nye kalenderen siden 1582, mens Russland stadig brukte den julianske kalenderen da Alaska ble kjøpt fra dem i 1867.

Formelen er , hvor:

  • d er dag i måneden,
  • m er månedens tall i månedstabellen,
  • y er de to siste siffrene i årstallet, og
  • c er århundretallet. For en gregoriansk dato så er dette 6 hvis de første to sifrene i årstallet er delelig med fire og etterfølgende århundrer er 4-2-0 (så århundretallene for 2000, 2100, 2200, og 2300 er respektive 6, 4, 2 og 0). For en juliansk dato, så er dette 6 for 1200 og etterfølgende århundrer trekker man fra 1 inntil 0, så er neste århundre 6 igjen (så 1300 er 5 og 1100 er 0).

Hvis resultatet er 0, så var datoen en søndag, hvis 1, en mandag, osv.

Dagstabell

[rediger | rediger kilde]
Dato d Dag
01 08 15 22 29 1 Mandag
02 09 16 23 30 2 Tirsdag
03 10 17 24 31 3 Onsdag
04 11 18 25 4 Torsdag
05 12 19 26 5 Fredag
06 13 20 27 6 Lørdag
07 14 21 28 0 Søndag

Månedstabell

[rediger | rediger kilde]
Måned m Skuddår
Januar 0 6
Februar 3 2
Mars 3
April 6
Mai 1
Juni 4
Juli 6
August 2
September 5
Oktober 0
November 3
Desember 5

Årstabell

[rediger | rediger kilde]
Årstall modulo 100 y
00 06 17 23 28 34 45 51 56 62 73 79 84 90 0
01 07 12 18 29 35 40 46 57 63 68 74 85 91 96 1
02 13 19 24 30 41 47 52 58 69 75 80 86 97 2
03 08 14 25 31 36 42 53 59 64 70 81 87 92 98 3
09 15 20 26 37 43 48 54 65 71 76 82 93 99 4
04 10 21 27 32 38 49 55 60 66 77 83 88 94 5
05 11 16 22 33 39 44 50 61 67 72 78 89 95 6

Århundrestabell

[rediger | rediger kilde]
Gregoriansk kalender Juliansk kalender
Århundre mod 4 Århundre mod 7 c
(1700, 2100) 1 (1400, 0700) 0 4
(1500, 0800) 1 3
(1800, 2200) 2 (1600, 0900) 2 2
(1700, 1000) 3 1
(1900, 2300) 3 (1800, 1100) 4 0
(2000, 2400) 0 (1200, 0500) 5 6
(1300, 0600) 6 5

Fullstendig tabell

[rediger | rediger kilde]
Dato 01 02 03 04 05 06 07
08 09 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
Måned 29 30 31 Årstall modulo 28 Århundre mod 4 Århundre mod 7
4 07 Søn Man Tir Ons Tor Fre Sat 01 07 12 18 24 16000 2000 0 0500 01200 5
9 012 Lør Søn Man Tir Ons Tor Fre 02 08 13 19 24 0600 01300 6
6 Fre Lør Søn Man Tir Ons Tor 03 08 14 20 25 1700 02100 1 0700 01400 0
20 3 011 Tor Fre Sat Søn Man Tir Ons 04 09 15 20 26 08000 1500 1
8 Ons Tor Fre Lør Søn Man Tir 04 10 16 21 27 1800 02200 2 0900 00200 2
5 Tir Ons Tor Fre Lør Søn Mon 05 11 16 22 00 10000 0300 3
10 10 Mon Tue Wed Tor Fre Lør Søn 06 12 17 23 00 1900 02300 3 1100 00400 4

For å bestemme ukedag (1. januar 2000, lørdag)

  • dag i måneden: 1 ~ 31 (1)
  • måneden: 1 for januar ~ 12 for desember (1,man)
  • året: 00 ~ 99 mod 28 og kursiv for januar eller februar i skuddår (00 ~ man)
  • århundre mod 4 for den gregorianske kalenderen og mod 7 for den julianske kalenderen (20 or 0 ~ lør).

For å bestemme søndagsbokstaven til et årstall: (2100 C ~ 2199 F)

  • the century column: from the century row to Sun which is in the column and in the row (21 or 1)
  • the dominical letter: Mon for A ~ Sun for G from the year row to the century column (00 ~ Wed for C, 15 for 99 ~ Sat for F).

For den gregorianske datoen 1. januar 2000 (et skuddår):

  • The day of the month: 1
  • January in the months table: 6
  • Last two digits of year (divided by 4): 0
  • Century number: 6

The result is 13, leaving a remainder of 6 when divided by 7, so January 1, 2000 was a Saturday.

For den julianske datoen 13. oktober 1307:

  • The day of the month: 13
  • October in the months table: 0
  • Last two digits of year divided by 4: 1
  • Last two digits of year: 7
  • Century number: 5

The result is 26, leaving a remainder of 5 when divided by 7, so October 13, 1307 was a Friday.

Gauss' algoritme

[rediger | rediger kilde]

Formler utledet fra Gauss' algoritme

[rediger | rediger kilde]

Andre varianter

[rediger | rediger kilde]

Andre, rent matematiske algoritmer

[rediger | rediger kilde]
  • Zellers algoritme
  • Kraitchiks algoritme
  • Schwerdtfegers variant
  • Tønderings algoritme
  • Dinhs algoritme

Andre metoder (som bruker tabeller eller lignende)

[rediger | rediger kilde]

Lewis Carrolls metode

[rediger | rediger kilde]

Implementasjons-avhengige metoder av Sakamoto, Lachman, Keith og Craver

[rediger | rediger kilde]

Babwanis metode

[rediger | rediger kilde]

Referanser

[rediger | rediger kilde]
  1. ^ Richards, E.G. (1999). Mapping Time: The Calendar and Its History. Oxford University Press.

Litteratur

[rediger | rediger kilde]
  • Gauss, Carl F. (1981). «Den Wochentag des 1. Januar eines Jahres zu finden. Güldene Zahl. Epakte. Ostergrenze.». Werke. herausgegeben von der Königlichen Gesellschaft der Wissenschaften zu Göttingen. (2. Nachdruckaufl. utg.). Hildesheim: Georg Olms Verlag. s. 206–207. ISBN 9783487046433. 
  • Hale-Evans, Ron (2006). «Hack #43: Calculate any weekday». Mind performance hacks (1st utg.). Beijing: O'Reilly. s. 164–169. ISBN 9780596101534. 
  • Thioux, Marc; Stark, David E.; Klaiman, Cheryl; Schultz, Robert T. (2006). «The day of the week when you were born in 700 ms: Calendar computation in an autistic savant.». Journal of Experimental Psychology: Human Perception and Performance. 32 (5): 1155–1168. doi:10.1037/0096-1523.32.5.1155. 
  • Treffert, Darold A. (12. oktober 2011). «Why calendar calculating?». Islands of genius : the bountiful mind of the autistic, acquired, and sudden savant (1. publ., [repr.]. utg.). London: Jessica Kingsley. s. 63–66. ISBN 9781849058735. 

Eksterne lenker

[rediger | rediger kilde]
Autoritetsdata